<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>Collision Checker: /home/osboxes/Documents/p3/root_comm/root/tools/commonroad-collision-checker/cpp/collision/primitive_collision_tests.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { init_search(); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">Collision Checker
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_df511e5bd85cec96854b39d5e1c27aa8.html">cpp</a></li><li class="navelem"><a class="el" href="dir_bf0f0c8865c1942e08ab5157e2c596db.html">collision</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">primitive_collision_tests.h</div>  </div>
</div><!--header-->
<div class="contents">
<a href="primitive__collision__tests_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="preprocessor">#ifndef PRIMITIVE_COLLISION_TESTS_H_</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="preprocessor">#define PRIMITIVE_COLLISION_TESTS_H_</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;</div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;</div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="preprocessor">#include &lt;array&gt;</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="preprocessor">#include &lt;math.h&gt;</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="preprocessor">#include &lt;Eigen/Dense&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="preprocessor">#include &lt;assert.h&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;</div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="shape_8h.html">shape.h</a>&quot;</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point_8h.html">point.h</a>&quot;</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="rectangle__aabb_8h.html">rectangle_aabb.h</a>&quot;</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="rectangle__obb_8h.html">rectangle_obb.h</a>&quot;</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sphere_8h.html">sphere.h</a>&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="triangle_8h.html">triangle.h</a>&quot;</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="shapegroup_8h.html">shapegroup.h</a>&quot;</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="timevariant__collisionobject_8h.html">timevariant_collisionobject.h</a>&quot;</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno"><a class="line" href="primitive__collision__tests_8h.html#a002b2f4894492820fe708b1b7e7c5e70">   24</a></span>&#160;<span class="preprocessor">#define EPSILON (1e-05)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacecollision.html">collision</a> {</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;    </div><div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html">   27</a></span>&#160;<span class="keyword">namespace </span>primitive_tests {</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="comment">// Compute the 2D pseudo cross product Dot(Perp(u), v)</span></div><div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a8506433b70803c59b4d3fa98530b0151">   32</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">float</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a8506433b70803c59b4d3fa98530b0151">cross2D</a>(<span class="keyword">const</span> Eigen::Vector2d&amp; u, <span class="keyword">const</span> Eigen::Vector2d&amp; v) {</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;  <span class="keywordflow">return</span> u(1)*v(0) - u(0)*v(1);</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;}</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="comment">// TODO: test it</span></div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">   37</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_point.html">Point</a>&amp; point_first,</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;                               <span class="keyword">const</span> <a class="code" href="classcollision_1_1_point.html">Point</a>&amp; point_second) {</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;  Eigen::Vector2d d = point_first.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() - point_second.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>();</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;  <span class="keywordflow">if</span> (d.squaredNorm() &lt;= <a class="code" href="primitive__collision__tests_8h.html#a002b2f4894492820fe708b1b7e7c5e70">EPSILON</a>) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;}</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="comment">// TODO: test it</span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="comment">// Test if 2D point P lies inside the counterclockwise 2D triangle ABC</span></div><div class="line"><a name="l00046"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#aae8af9801d3187a075bdd3cc30230b7d">   46</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_point.html">Point</a>&amp; point,</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;                               <span class="keyword">const</span> <a class="code" href="classcollision_1_1_triangle.html">Triangle</a>&amp; triangle) {</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;  <span class="comment">// Translate point and triangle so that point lies at origin</span></div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;  Eigen::Vector2d pa = point.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>()-triangle.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>();</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;  Eigen::Vector2d pb = point.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>()-triangle.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>();</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;  Eigen::Vector2d ba = triangle.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>()-triangle.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>();</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;  Eigen::Vector2d cb = triangle.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>()-triangle.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>();</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;  <span class="keywordtype">float</span> pab = <a class="code" href="namespacecollision_1_1primitive__tests.html#a8506433b70803c59b4d3fa98530b0151">cross2D</a>(pa,ba);</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;  <span class="keywordtype">float</span> pbc = <a class="code" href="namespacecollision_1_1primitive__tests.html#a8506433b70803c59b4d3fa98530b0151">cross2D</a>(pb,cb);</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;  <span class="keywordflow">if</span>(std::signbit(pab) != std::signbit(pbc))</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;  Eigen::Vector2d pc = point.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>()-triangle.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>();</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;  Eigen::Vector2d ac = triangle.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>()-triangle.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>();</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;  <span class="keywordtype">float</span> pca = <a class="code" href="namespacecollision_1_1primitive__tests.html#a8506433b70803c59b4d3fa98530b0151">cross2D</a>(pc,ac);</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;  <span class="keywordflow">if</span>(std::signbit(pab) != std::signbit(pca))</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;}</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;<span class="comment">// TODO: test it</span></div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a84dee5227a947c35dfa31ff854ca90a8">   69</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_point.html">Point</a>&amp; point,</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;                               <span class="keyword">const</span> <a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html">RectangleAABB</a>&amp; aabb) {</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;  Eigen::Vector2d p = point.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() - aabb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>();</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;  <span class="keywordflow">if</span>(fabs(p(0)) &lt;= aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>() &amp;&amp; fabs(p(1)) &lt;= aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>())</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;}</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;<span class="comment">// TODO: test it</span></div><div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a98cab4532cc74bb834a6df58f32b06eb">   79</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_point.html">Point</a>&amp; point,</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;                               <span class="keyword">const</span> <a class="code" href="classcollision_1_1_rectangle_o_b_b.html">RectangleOBB</a>&amp; obb) {</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;  Eigen::Vector2d pt1(obb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() - obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#ac8b2ebc023ff0dcc5ee861f8cdf79b60">r_x</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a44f98769d169cf2634529ac88d8352b5">local_x_axis</a>() - </div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;                      obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#aff8381b1b76c1e1fa8e4278de0cb3ec4">r_y</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a1d5112197db9eaff9b32f451ea2de9d2">local_y_axis</a>());</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;  Eigen::Vector2d pt2(obb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() + obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#ac8b2ebc023ff0dcc5ee861f8cdf79b60">r_x</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a44f98769d169cf2634529ac88d8352b5">local_x_axis</a>() - </div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;                      obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#aff8381b1b76c1e1fa8e4278de0cb3ec4">r_y</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a1d5112197db9eaff9b32f451ea2de9d2">local_y_axis</a>());</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;  Eigen::Vector2d pt3(obb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() + obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#ac8b2ebc023ff0dcc5ee861f8cdf79b60">r_x</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a44f98769d169cf2634529ac88d8352b5">local_x_axis</a>() + </div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;                      obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#aff8381b1b76c1e1fa8e4278de0cb3ec4">r_y</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a1d5112197db9eaff9b32f451ea2de9d2">local_y_axis</a>());</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;  Eigen::Vector2d pt4(obb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() - obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#ac8b2ebc023ff0dcc5ee861f8cdf79b60">r_x</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a44f98769d169cf2634529ac88d8352b5">local_x_axis</a>() + </div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;                      obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#aff8381b1b76c1e1fa8e4278de0cb3ec4">r_y</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a1d5112197db9eaff9b32f451ea2de9d2">local_y_axis</a>());</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;  <a class="code" href="classcollision_1_1_triangle.html">Triangle</a> triangle_1(pt1, pt2, pt3);</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;  <a class="code" href="classcollision_1_1_triangle.html">Triangle</a> triangle_2(pt3, pt4, pt1);</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(point, triangle_1) || </div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;          <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(point, triangle_2);</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;}</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;<span class="comment">// TODO: test it</span></div><div class="line"><a name="l00096"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a183ea28516c783b4ea5f6e6a5dd8f1c8">   96</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_point.html">Point</a>&amp; point, <span class="keyword">const</span> <a class="code" href="classcollision_1_1_sphere.html">Sphere</a>&amp; sphere) {</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;  Eigen::Vector2d p = point.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() - sphere.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>();</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;  <span class="keywordflow">if</span>(p.squaredNorm() &lt;= pow(sphere.<a class="code" href="classcollision_1_1_sphere.html#a4aef03654ecf223907681c955ee36300">radius</a>(), 2))</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;}</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;<span class="comment">// Computes if two AABBs collide.</span></div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;<span class="comment">// From: C. Ericson, Real-Time Collision Detection, pp. 80, 2004</span></div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;<span class="comment">// Return true if objects collide</span></div><div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a3ac2834116d6a5b2936787d7875c4a5c">  108</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html">RectangleAABB</a>&amp; aabb_first,</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;                               <span class="keyword">const</span> <a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html">RectangleAABB</a>&amp; aabb_second) {</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;  <span class="keywordflow">if</span>(fabs(aabb_first.<a class="code" href="classcollision_1_1_shape.html#af56eb3d64186c9fe8ca3e8917810b41c">center_x</a>() - aabb_second.<a class="code" href="classcollision_1_1_shape.html#af56eb3d64186c9fe8ca3e8917810b41c">center_x</a>()) &gt;</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;         (aabb_first.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>() + aabb_second.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>())) {</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;  }</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;  <span class="keywordflow">if</span>(fabs(aabb_first.<a class="code" href="classcollision_1_1_shape.html#aab73c99dc12f8032c2e28585e7c152b5">center_y</a>() - aabb_second.<a class="code" href="classcollision_1_1_shape.html#aab73c99dc12f8032c2e28585e7c152b5">center_y</a>()) &gt;</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;         (aabb_first.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>()+ aabb_second.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>())) {</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;  }</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;}</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;<span class="comment">// TODO: test it</span></div><div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#ab8a5184bff6547a2709db31408ec6b65">  122</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html">RectangleAABB</a>&amp; aabb,</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;                               <span class="keyword">const</span> <a class="code" href="classcollision_1_1_rectangle_o_b_b.html">RectangleOBB</a>&amp; obb) {</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;  Eigen::Matrix2d aabb_axes;</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;  aabb_axes &lt;&lt; 1, 0, 0, 1;</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;  <span class="comment">// Compute rotation matrix expression second in first&#39;s coordinate frame</span></div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;  Eigen::Matrix2d R = aabb_axes.transpose() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#afd528c300c0e84268f3668ec30e325ee">local_axes</a>();</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;  <span class="comment">// Compute the translation vector between the boxes in first&#39;s coordinate frame</span></div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;  Eigen::Vector2d t = aabb_axes.transpose() * (obb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() - aabb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>());</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;  <span class="comment">// Project B onto A&#39;s axes</span></div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0; i&lt;2; i++) {</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;      <span class="keywordtype">double</span> r_first  = aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#aa9a06f7b2d8e34b1560a5f90d95e6141">r</a>(i);</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;      <span class="keywordtype">double</span> r_second = obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#ac8b2ebc023ff0dcc5ee861f8cdf79b60">r_x</a>() * fabs(R(i,0)) + obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#aff8381b1b76c1e1fa8e4278de0cb3ec4">r_y</a>() * fabs(R(i,1));</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;      <span class="keywordflow">if</span>(fabs(t(i)) &gt; r_first + r_second)</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;          <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;  }</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0; i&lt;2; i++) {</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;    <span class="keywordtype">double</span> r_first  = aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>() * fabs(R(0,i)) + aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>() * fabs(R(1,i));</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;    <span class="keywordtype">double</span> r_second = obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a797e90c5807e872a3f9ea070e8c4e2f8">r</a>(i);</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;    <span class="keywordtype">double</span> t_proj   = fabs(t.transpose() * R.col(i));</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;    <span class="keywordflow">if</span>(t_proj &gt; r_first + r_second)</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;  }</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;    </div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;<span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;}</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="comment">// Computes if a sphere and an AABB collide.</span></div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;<span class="comment">// From: C. Ericson, Real-Time Collision Detection, pp. 165-166, 2004</span></div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;<span class="comment">// Return true if objects collide</span></div><div class="line"><a name="l00157"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a2976b138a47409e7fad7113502b12c47">  157</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html">RectangleAABB</a>&amp; aabb,</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;                               <span class="keyword">const</span> <a class="code" href="classcollision_1_1_sphere.html">Sphere</a>&amp; sphere) {</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;  <span class="keywordtype">double</span> sq_dis = aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a9cd0e5709ca571f12e7ba12a3372aaf1">squareDisToPoint</a>(sphere.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>());</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;  <span class="comment">// Collision if squared distance between the center of the sphere and AABB</span></div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;  <span class="comment">//  is less than the radius of the sphere.</span></div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;  <span class="keywordflow">if</span>(sq_dis &lt;= pow(sphere.<a class="code" href="classcollision_1_1_sphere.html#a4aef03654ecf223907681c955ee36300">radius</a>(),2))</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;}</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a8b4eaa3cc12769d82d432e1b253336d2">  168</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html">RectangleAABB</a>&amp; aabb,</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;                               <span class="keyword">const</span> <a class="code" href="classcollision_1_1_triangle.html">Triangle</a>&amp; triangle) {</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;  Eigen::Vector2d v1 = triangle.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>()-aabb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>();</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;  Eigen::Vector2d v2 = triangle.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>()-aabb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>();</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;  Eigen::Vector2d v3 = triangle.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>()-aabb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>();</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;  </div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;  <span class="comment">// two separating axis of the rectangle</span></div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;  <span class="keywordflow">if</span> (v1(0) &lt; -aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>() &amp;&amp;</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;      v2(0) &lt; -aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>() &amp;&amp;</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;      v3(0) &lt; -aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>()) {</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;  }</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;  <span class="keywordflow">if</span> (v1(0) &gt; aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>() &amp;&amp;</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;      v2(0) &gt; aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>() &amp;&amp;</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;      v3(0) &gt; aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>()) {</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;  }</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;  <span class="keywordflow">if</span> (v1(1) &lt; -aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>() &amp;&amp;</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;      v2(1) &lt; -aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>() &amp;&amp;</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;      v3(1) &lt; -aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>()) {</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;  }</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;  <span class="keywordflow">if</span> (v1(1) &gt; aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>() &amp;&amp;</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;      v2(1) &gt; aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>() &amp;&amp;</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;      v3(1) &gt; aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>()) {</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;  }</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;  </div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;  <span class="comment">// three separating axis of the triangle</span></div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;  Eigen::Vector2d a; <span class="comment">// axis equation coefficient</span></div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;  <span class="keywordtype">double</span> d; <span class="comment">// axis equation distance</span></div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;  </div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;  Eigen::Vector2d r1(-aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>(), -aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>());</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;  Eigen::Vector2d r2(+aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>(), -aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>());</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;  Eigen::Vector2d r3(+aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>(), +aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>());</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;  Eigen::Vector2d r4(-aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">r_x</a>(), +aabb.<a class="code" href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">r_y</a>());</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;  </div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;  <span class="comment">// axis perpendicular to v1-&gt;v2</span></div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;  a(0) = v2(1)-v1(1);</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;  a(1) = -(v2(0)-v1(0));</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;  d = a.transpose()*v1;</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;  <span class="keywordflow">if</span> (a.transpose()*v3 &gt; d) {</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;    d = -d;</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;  }</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;  </div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;  <span class="keywordflow">if</span> (a.transpose()*r1 &gt; d &amp;&amp;</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;      a.transpose()*r2 &gt; d &amp;&amp;</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;      a.transpose()*r3 &gt; d &amp;&amp;</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;      a.transpose()*r4 &gt; d) {</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;  }</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;  </div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;  <span class="comment">// axis perpendicular to v2-&gt;v3</span></div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;  a(0) = v3(1)-v2(1);</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;  a(1) = -(v3(0)-v2(0));</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;  d = a.transpose()*v2;</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;  <span class="keywordflow">if</span> (a.transpose()*v1 &gt; d) {</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;    d = -d;</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;  }</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;  </div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;  <span class="keywordflow">if</span> (a.transpose()*r1 &gt; d &amp;&amp;</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;      a.transpose()*r2 &gt; d &amp;&amp;</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;      a.transpose()*r3 &gt; d &amp;&amp;</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;      a.transpose()*r4 &gt; d) {</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;  }</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;  <span class="comment">// axis perpendicular to v3-&gt;v1</span></div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;  a(0) = v1(1)-v3(1);</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;  a(1) = -(v1(0)-v3(0));</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;  d = a.transpose()*v3;</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;  <span class="keywordflow">if</span> (a.transpose()*v2 &gt; d) {</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;    d = -d;</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;  }</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;  </div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;  <span class="keywordflow">if</span> (a.transpose()*r1 &gt; d &amp;&amp;</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;      a.transpose()*r2 &gt; d &amp;&amp;</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;      a.transpose()*r3 &gt; d &amp;&amp;</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;      a.transpose()*r4 &gt; d) {</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;  }</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;}</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;<span class="comment">// Computes if two OBBs collide.</span></div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;<span class="comment">// From: C. Ericson, Real-Time Collision Detection, pp. 103-105, 2004</span></div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;<span class="comment">// Return true if objects collide</span></div><div class="line"><a name="l00257"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a9443cf46f9f39fae8611a7f5328fc507">  257</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_rectangle_o_b_b.html">RectangleOBB</a>&amp; obb_first,</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;                               <span class="keyword">const</span> <a class="code" href="classcollision_1_1_rectangle_o_b_b.html">RectangleOBB</a>&amp; obb_second) {</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;  <span class="comment">// Compute rotation matrix expression second in first&#39;s coordinate frame</span></div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;  Eigen::Matrix2d R = obb_first.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#afd528c300c0e84268f3668ec30e325ee">local_axes</a>().transpose() * </div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;                      obb_second.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#afd528c300c0e84268f3668ec30e325ee">local_axes</a>();</div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;  <span class="comment">// Compute the translation vector between the boxes in first&#39;s coordinate</span></div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;  <span class="comment">// frame</span></div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;  Eigen::Vector2d t = obb_first.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#afd528c300c0e84268f3668ec30e325ee">local_axes</a>().transpose() *</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;                      (obb_second.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() - obb_first.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>());</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;  <span class="comment">// Project B onto A&#39;s axes</span></div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0; i&lt;2; i++) {</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;    <span class="keywordtype">double</span> r_first  = obb_first.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a797e90c5807e872a3f9ea070e8c4e2f8">r</a>(i);</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;    <span class="keywordtype">double</span> r_second = obb_second.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#ac8b2ebc023ff0dcc5ee861f8cdf79b60">r_x</a>() * fabs(R(i,0)) +</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;                      obb_second.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#aff8381b1b76c1e1fa8e4278de0cb3ec4">r_y</a>() * fabs(R(i,1));</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;    <span class="keywordflow">if</span>(fabs(t(i)) &gt; r_first + r_second)</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;  }</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;  <span class="comment">// Project A onto B&#39;s axes</span></div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;  <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0; i&lt;2; i++) {</div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;    <span class="keywordtype">double</span> r_first  = obb_first.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#ac8b2ebc023ff0dcc5ee861f8cdf79b60">r_x</a>() * fabs(R(0,i)) +</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;                      obb_first.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#aff8381b1b76c1e1fa8e4278de0cb3ec4">r_y</a>() * fabs(R(1,i));</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;    <span class="keywordtype">double</span> r_second = obb_second.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a797e90c5807e872a3f9ea070e8c4e2f8">r</a>(i);</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;    <span class="keywordtype">double</span> t_proj   = fabs(t.transpose() * R.col(i));</div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;    <span class="keywordflow">if</span>(t_proj &gt; r_first + r_second)</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;  }</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;}</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;<span class="comment">// TODO: CHECK THIS! BUG?</span></div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;<span class="comment">// Computes if a sphere and an OBB collide.</span></div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;<span class="comment">// From: C. Ericson, Real-Time Collision Detection, pp. 166-167, 2004</span></div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;<span class="comment">// Rerturn true if objects collide</span></div><div class="line"><a name="l00293"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a2504358a6e51419d3cf9bbae2dc022eb">  293</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_rectangle_o_b_b.html">RectangleOBB</a>&amp; obb, <span class="keyword">const</span> <a class="code" href="classcollision_1_1_sphere.html">Sphere</a>&amp; sphere) {</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;  <span class="keywordtype">double</span> sq_dis = obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#acfd69dbf1ef5814ca1ffcacd8a687886">squareDisToPoint</a>(sphere.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>());</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;  <span class="comment">// Collision if squared distance between the center of the sphere and AABB</span></div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;  <span class="comment">//  is less than the radius of the sphere.</span></div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;  <span class="keywordflow">if</span>(sq_dis &lt;= pow(sphere.<a class="code" href="classcollision_1_1_sphere.html#a4aef03654ecf223907681c955ee36300">radius</a>(),2))</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;<span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;}</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;<span class="comment">// Computes if two spheres collide.</span></div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;<span class="comment">// From: C. Ericson, Real-Time Collision Detection, pp. 88, 2004</span></div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;<span class="comment">// Return true if objects collide</span></div><div class="line"><a name="l00307"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#af7fe1e7ad0ffbd6f625838835b94f583">  307</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_sphere.html">Sphere</a>&amp; sphere_first,</div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;                               <span class="keyword">const</span> <a class="code" href="classcollision_1_1_sphere.html">Sphere</a>&amp; sphere_second) {</div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;  <span class="keywordtype">double</span> dis = pow((sphere_first.<a class="code" href="classcollision_1_1_shape.html#af56eb3d64186c9fe8ca3e8917810b41c">center_x</a>() - sphere_second.<a class="code" href="classcollision_1_1_shape.html#af56eb3d64186c9fe8ca3e8917810b41c">center_x</a>()),2) +</div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;               pow((sphere_first.<a class="code" href="classcollision_1_1_shape.html#aab73c99dc12f8032c2e28585e7c152b5">center_y</a>() - sphere_second.<a class="code" href="classcollision_1_1_shape.html#aab73c99dc12f8032c2e28585e7c152b5">center_y</a>()),2);</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;  <span class="comment">// Spheres intersect if squared distance between centers is less than squared</span></div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;  <span class="comment">// sum of radii</span></div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;  <span class="keywordtype">double</span> sum_radii = sphere_first.<a class="code" href="classcollision_1_1_sphere.html#a4aef03654ecf223907681c955ee36300">radius</a>() + sphere_second.<a class="code" href="classcollision_1_1_sphere.html#a4aef03654ecf223907681c955ee36300">radius</a>();</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;  <span class="keywordflow">return</span> dis &lt;= pow(sum_radii,2);</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;}</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;</div><div class="line"><a name="l00317"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a2d503287f5b361de9ad3d9786c11dce2">  317</a></span>&#160;<span class="keyword">inline</span> Eigen::Vector2d <a class="code" href="namespacecollision_1_1primitive__tests.html#a2d503287f5b361de9ad3d9786c11dce2">closestPointOnLineSegment</a>(<span class="keyword">const</span> Eigen::Vector2d &amp;l_a,</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;                                                 <span class="keyword">const</span> Eigen::Vector2d &amp;l_b,</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;                                                 <span class="keyword">const</span> Eigen::Vector2d &amp;pt) {</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;  Eigen::Vector2d a = pt - l_a;</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;  Eigen::Vector2d b = l_b - l_a;</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;  <span class="keywordtype">double</span> r = a.dot(b) / b.dot(b);</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;  r = std::max(0.0, r);</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;  r = std::min(1.0, r);</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;  <span class="keywordflow">return</span> l_a + r * b;</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;}</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;    </div><div class="line"><a name="l00328"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a5397d015356484f41c199a3d16374537">  328</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a5397d015356484f41c199a3d16374537">pointInsideTriangle</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_triangle.html">Triangle</a>&amp; triangle,</div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;                                <span class="keyword">const</span> Eigen::Vector2d &amp;pt) {</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;  <span class="keyword">auto</span> circle_point_in_same_halfspace = [&amp;] (<span class="keyword">const</span> Eigen::Vector2d &amp;l_a,</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;                                             <span class="keyword">const</span> Eigen::Vector2d &amp;l_b,</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;                                             <span class="keyword">const</span> Eigen::Vector2d &amp;pt_1,</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;                                             <span class="keyword">const</span> Eigen::Vector2d &amp;pt_2)</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;                                             -&gt; <span class="keywordtype">bool</span> {</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;    <span class="keyword">auto</span> t = l_b - l_a;</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;    <span class="keyword">auto</span> n = Eigen::Vector2d(t(1), -t(0));</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;    <span class="keywordtype">double</span> d_pt_1, d_pt_2, d;</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;    d_pt_1 = n.dot(pt_1);</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;    d_pt_2 = n.dot(pt_2);</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;    d = n.dot(l_a);</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;    <span class="keywordflow">if</span> (((d_pt_1 &lt;= d) &amp;&amp; (d_pt_2 &lt;= d)) ||</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;        ((d &lt;= d_pt_1) &amp;&amp; (d &lt;= d_pt_2))) {</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;    }</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;  };</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;  <span class="keywordflow">if</span> (circle_point_in_same_halfspace(triangle.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>(), triangle.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>(),</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;                                     triangle.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>(), pt) &amp;&amp;</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;      circle_point_in_same_halfspace(triangle.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>(), triangle.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>(),</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;                                     triangle.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>(), pt) &amp;&amp;</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;      circle_point_in_same_halfspace(triangle.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>(), triangle.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>(),</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;                                     triangle.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>(), pt)) {</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;  }</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;}</div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;</div><div class="line"><a name="l00362"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#acfe04d37e1f70cbb599e78f655c13ac3">  362</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_sphere.html">Sphere</a>&amp; sphere, <span class="keyword">const</span> <a class="code" href="classcollision_1_1_triangle.html">Triangle</a>&amp; triangle) {</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;  <span class="keywordflow">if</span> (<a class="code" href="namespacecollision_1_1primitive__tests.html#a5397d015356484f41c199a3d16374537">pointInsideTriangle</a>(triangle, sphere.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>())) {</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;  }</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;        </div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;  Eigen::Vector2d vector_center_to_closet_point = (</div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;    <a class="code" href="namespacecollision_1_1primitive__tests.html#a2d503287f5b361de9ad3d9786c11dce2">closestPointOnLineSegment</a>(triangle.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>(), triangle.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>(),</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;                              sphere.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>()) - sphere.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>());</div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;  <span class="keywordflow">if</span> (vector_center_to_closet_point.dot(vector_center_to_closet_point) &lt;=</div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;      sphere.<a class="code" href="classcollision_1_1_sphere.html#a4aef03654ecf223907681c955ee36300">radius</a>() * sphere.<a class="code" href="classcollision_1_1_sphere.html#a4aef03654ecf223907681c955ee36300">radius</a>()) {</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;  }</div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;        </div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;  vector_center_to_closet_point = (</div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;    <a class="code" href="namespacecollision_1_1primitive__tests.html#a2d503287f5b361de9ad3d9786c11dce2">closestPointOnLineSegment</a>(triangle.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>(), triangle.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>(),</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;                              sphere.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>()) - sphere.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>());</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;  <span class="keywordflow">if</span> (vector_center_to_closet_point.dot(vector_center_to_closet_point) &lt;=</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;    sphere.<a class="code" href="classcollision_1_1_sphere.html#a4aef03654ecf223907681c955ee36300">radius</a>() * sphere.<a class="code" href="classcollision_1_1_sphere.html#a4aef03654ecf223907681c955ee36300">radius</a>()) {</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;  }</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;        </div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;  vector_center_to_closet_point = (</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;      <a class="code" href="namespacecollision_1_1primitive__tests.html#a2d503287f5b361de9ad3d9786c11dce2">closestPointOnLineSegment</a>(triangle.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>(), triangle.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>(),</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;                                sphere.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>()) -</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;                                sphere.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>());</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;  <span class="keywordflow">if</span> (vector_center_to_closet_point.dot(vector_center_to_closet_point) &lt;=</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;      sphere.<a class="code" href="classcollision_1_1_sphere.html#a4aef03654ecf223907681c955ee36300">radius</a>() * sphere.<a class="code" href="classcollision_1_1_sphere.html#a4aef03654ecf223907681c955ee36300">radius</a>()) {</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;  }</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;  </div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;}</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a4cd136a5a542e61f1328d7c539cce610">  395</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_triangle.html">Triangle</a>&amp; triangle_a,</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;                               <span class="keyword">const</span> <a class="code" href="classcollision_1_1_triangle.html">Triangle</a>&amp; triangle_b) {</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;  Eigen::Vector2d n;</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;  std::array&lt;double, 6&gt; projected_values = {0,0,0,0,0,0};</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;  <span class="keyword">auto</span> normal_vector = [] (Eigen::Vector2d v) -&gt;  Eigen::Vector2d { </div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;    <span class="keywordflow">return</span> Eigen::Vector2d(v(1), -v(0));</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;  };</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;  <span class="keyword">auto</span> project_vertices = [&amp;] () {</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;    projected_values[0] = n.transpose()*triangle_a.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>();</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    projected_values[1] = n.transpose()*triangle_a.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>();</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;    projected_values[2] = n.transpose()*triangle_a.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>();</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;    projected_values[3] = n.transpose()*triangle_b.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>();</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;    projected_values[4] = n.transpose()*triangle_b.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>();</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;    projected_values[5] = n.transpose()*triangle_b.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>();</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;  };</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;  <span class="keyword">auto</span> separated = [&amp;] () -&gt; <span class="keywordtype">bool</span> {</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;    <span class="keywordtype">double</span> min_t1, max_t1, min_t2, max_t2;</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;    min_t1 = std::min(std::min(projected_values[0], projected_values[1]),</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;                      projected_values[2]);</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;    max_t1 = std::max(std::max(projected_values[0], projected_values[1]),</div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;                      projected_values[2]);</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;    min_t2 = std::min(std::min(projected_values[3], projected_values[4]),</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;                      projected_values[5]);</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;    max_t2 = std::max(std::max(projected_values[3], projected_values[4]),</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;                      projected_values[5]);</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;    <span class="keywordflow">return</span> min_t1&gt;max_t2 || min_t2&gt;max_t1;</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;  };</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;  <span class="comment">// separating axes of triangle 1</span></div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;  <span class="comment">// axis perpendicular to v1-&gt;v2</span></div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;  n = normal_vector(triangle_a.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>()-triangle_a.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>());</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;  project_vertices();</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;  <span class="keywordflow">if</span> (separated()) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;</div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;  <span class="comment">// axis perpendicular to v2-&gt;v3</span></div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;  n = normal_vector(triangle_a.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>()-triangle_a.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>());</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;  project_vertices();</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;  <span class="keywordflow">if</span> (separated()) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;</div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;  <span class="comment">// axis perpendicular to v3-&gt;v1</span></div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;  n = normal_vector(triangle_a.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>()-triangle_a.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>());</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;  project_vertices();</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;  <span class="keywordflow">if</span> (separated()) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;  <span class="comment">// separating axes of triangle 2</span></div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;  <span class="comment">// axis perpendicular to v1-&gt;v2</span></div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;  n = normal_vector(triangle_b.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>()-triangle_b.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>());</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;  project_vertices();</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;  <span class="keywordflow">if</span> (separated()) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;  <span class="comment">// axis perpendicular to v2-&gt;v3</span></div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;  n = normal_vector(triangle_b.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>()-triangle_b.<a class="code" href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">v2</a>());</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;  project_vertices();</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;  <span class="keywordflow">if</span> (separated()) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;</div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;  <span class="comment">// axis perpendicular to v3-&gt;v1</span></div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;  n = normal_vector(triangle_b.<a class="code" href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">v1</a>()-triangle_b.<a class="code" href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">v3</a>());</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;  project_vertices();</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;  <span class="keywordflow">if</span> (separated()) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;}</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;</div><div class="line"><a name="l00461"></a><span class="lineno"><a class="line" href="namespacecollision_1_1primitive__tests.html#a529f9ce9397be56eb93bbb3938f0954b">  461</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(<span class="keyword">const</span> <a class="code" href="classcollision_1_1_rectangle_o_b_b.html">RectangleOBB</a>&amp; obb,</div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;                               <span class="keyword">const</span> <a class="code" href="classcollision_1_1_triangle.html">Triangle</a>&amp; triangle) {</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;  Eigen::Vector2d pt1(obb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() - obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#ac8b2ebc023ff0dcc5ee861f8cdf79b60">r_x</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a44f98769d169cf2634529ac88d8352b5">local_x_axis</a>() - </div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;                      obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#aff8381b1b76c1e1fa8e4278de0cb3ec4">r_y</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a1d5112197db9eaff9b32f451ea2de9d2">local_y_axis</a>());</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;  Eigen::Vector2d pt2(obb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() + obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#ac8b2ebc023ff0dcc5ee861f8cdf79b60">r_x</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a44f98769d169cf2634529ac88d8352b5">local_x_axis</a>() - </div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;                      obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#aff8381b1b76c1e1fa8e4278de0cb3ec4">r_y</a>()*obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a1d5112197db9eaff9b32f451ea2de9d2">local_y_axis</a>());</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;  Eigen::Vector2d pt3(obb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() + obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#ac8b2ebc023ff0dcc5ee861f8cdf79b60">r_x</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a44f98769d169cf2634529ac88d8352b5">local_x_axis</a>() + </div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;                      obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#aff8381b1b76c1e1fa8e4278de0cb3ec4">r_y</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a1d5112197db9eaff9b32f451ea2de9d2">local_y_axis</a>());</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;  Eigen::Vector2d pt4(obb.<a class="code" href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">center</a>() - obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#ac8b2ebc023ff0dcc5ee861f8cdf79b60">r_x</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a44f98769d169cf2634529ac88d8352b5">local_x_axis</a>() +</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;                      obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#aff8381b1b76c1e1fa8e4278de0cb3ec4">r_y</a>() * obb.<a class="code" href="classcollision_1_1_rectangle_o_b_b.html#a1d5112197db9eaff9b32f451ea2de9d2">local_y_axis</a>());</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;  <a class="code" href="classcollision_1_1_triangle.html">Triangle</a> triangle_1(pt1, pt2, pt3);</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;  <a class="code" href="classcollision_1_1_triangle.html">Triangle</a> triangle_2(pt3, pt4, pt1);</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;  <span class="keywordflow">return</span> <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(triangle, triangle_1) ||</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;         <a class="code" href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collisionDetection</a>(triangle, triangle_2);</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;}</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;} <span class="comment">// namespace primitive_tests</span></div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;} <span class="comment">// namespace collision</span></div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;<span class="preprocessor">#endif</span></div><div class="ttc" id="classcollision_1_1_rectangle_o_b_b_html"><div class="ttname"><a href="classcollision_1_1_rectangle_o_b_b.html">collision::RectangleOBB</a></div><div class="ttdoc">Oriented rectangle. </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__obb_8h_source.html#l00016">rectangle_obb.h:16</a></div></div>
<div class="ttc" id="classcollision_1_1_triangle_html_a81b12c9ec2d73ae8d62bb5b16d22f35b"><div class="ttname"><a href="classcollision_1_1_triangle.html#a81b12c9ec2d73ae8d62bb5b16d22f35b">collision::Triangle::v1</a></div><div class="ttdeci">Eigen::Vector2d v1() const </div><div class="ttdef"><b>Definition:</b> <a href="triangle_8cc_source.html#l00136">triangle.cc:136</a></div></div>
<div class="ttc" id="classcollision_1_1_triangle_html_aaed988d40c78088b14af26c76169af68"><div class="ttname"><a href="classcollision_1_1_triangle.html#aaed988d40c78088b14af26c76169af68">collision::Triangle::v2</a></div><div class="ttdeci">Eigen::Vector2d v2() const </div><div class="ttdef"><b>Definition:</b> <a href="triangle_8cc_source.html#l00140">triangle.cc:140</a></div></div>
<div class="ttc" id="classcollision_1_1_rectangle_o_b_b_html_a1d5112197db9eaff9b32f451ea2de9d2"><div class="ttname"><a href="classcollision_1_1_rectangle_o_b_b.html#a1d5112197db9eaff9b32f451ea2de9d2">collision::RectangleOBB::local_y_axis</a></div><div class="ttdeci">Eigen::Vector2d local_y_axis() const </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__obb_8cc_source.html#l00141">rectangle_obb.cc:141</a></div></div>
<div class="ttc" id="classcollision_1_1_rectangle_a_a_b_b_html_a1ffba5c0b476a7ddd1b965eefd29963f"><div class="ttname"><a href="classcollision_1_1_rectangle_a_a_b_b.html#a1ffba5c0b476a7ddd1b965eefd29963f">collision::RectangleAABB::r_y</a></div><div class="ttdeci">double r_y() const </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__aabb_8cc_source.html#l00188">rectangle_aabb.cc:188</a></div></div>
<div class="ttc" id="classcollision_1_1_triangle_html"><div class="ttname"><a href="classcollision_1_1_triangle.html">collision::Triangle</a></div><div class="ttdoc">Triangle. </div><div class="ttdef"><b>Definition:</b> <a href="triangle_8h_source.html#l00017">triangle.h:17</a></div></div>
<div class="ttc" id="namespacecollision_1_1primitive__tests_html_a2d503287f5b361de9ad3d9786c11dce2"><div class="ttname"><a href="namespacecollision_1_1primitive__tests.html#a2d503287f5b361de9ad3d9786c11dce2">collision::primitive_tests::closestPointOnLineSegment</a></div><div class="ttdeci">Eigen::Vector2d closestPointOnLineSegment(const Eigen::Vector2d &amp;l_a, const Eigen::Vector2d &amp;l_b, const Eigen::Vector2d &amp;pt)</div><div class="ttdef"><b>Definition:</b> <a href="primitive__collision__tests_8h_source.html#l00317">primitive_collision_tests.h:317</a></div></div>
<div class="ttc" id="point_8h_html"><div class="ttname"><a href="point_8h.html">point.h</a></div></div>
<div class="ttc" id="classcollision_1_1_shape_html_af56eb3d64186c9fe8ca3e8917810b41c"><div class="ttname"><a href="classcollision_1_1_shape.html#af56eb3d64186c9fe8ca3e8917810b41c">collision::Shape::center_x</a></div><div class="ttdeci">double center_x() const </div><div class="ttdef"><b>Definition:</b> <a href="shape_8cc_source.html#l00021">shape.cc:21</a></div></div>
<div class="ttc" id="namespacecollision_1_1primitive__tests_html_a8506433b70803c59b4d3fa98530b0151"><div class="ttname"><a href="namespacecollision_1_1primitive__tests.html#a8506433b70803c59b4d3fa98530b0151">collision::primitive_tests::cross2D</a></div><div class="ttdeci">float cross2D(const Eigen::Vector2d &amp;u, const Eigen::Vector2d &amp;v)</div><div class="ttdef"><b>Definition:</b> <a href="primitive__collision__tests_8h_source.html#l00032">primitive_collision_tests.h:32</a></div></div>
<div class="ttc" id="classcollision_1_1_shape_html_af9039e8e16da1ad3e5bab9e1a13bcd37"><div class="ttname"><a href="classcollision_1_1_shape.html#af9039e8e16da1ad3e5bab9e1a13bcd37">collision::Shape::center</a></div><div class="ttdeci">Eigen::Vector2d center() const </div><div class="ttdoc">Get geometric center of shape. </div><div class="ttdef"><b>Definition:</b> <a href="shape_8cc_source.html#l00017">shape.cc:17</a></div></div>
<div class="ttc" id="primitive__collision__tests_8h_html_a002b2f4894492820fe708b1b7e7c5e70"><div class="ttname"><a href="primitive__collision__tests_8h.html#a002b2f4894492820fe708b1b7e7c5e70">EPSILON</a></div><div class="ttdeci">#define EPSILON</div><div class="ttdef"><b>Definition:</b> <a href="primitive__collision__tests_8h_source.html#l00024">primitive_collision_tests.h:24</a></div></div>
<div class="ttc" id="shapegroup_8h_html"><div class="ttname"><a href="shapegroup_8h.html">shapegroup.h</a></div></div>
<div class="ttc" id="namespacecollision_html"><div class="ttname"><a href="namespacecollision.html">collision</a></div><div class="ttdef"><b>Definition:</b> <a href="_application_8h_source.html#l00025">Application.h:25</a></div></div>
<div class="ttc" id="sphere_8h_html"><div class="ttname"><a href="sphere_8h.html">sphere.h</a></div></div>
<div class="ttc" id="classcollision_1_1_rectangle_o_b_b_html_a797e90c5807e872a3f9ea070e8c4e2f8"><div class="ttname"><a href="classcollision_1_1_rectangle_o_b_b.html#a797e90c5807e872a3f9ea070e8c4e2f8">collision::RectangleOBB::r</a></div><div class="ttdeci">Eigen::Vector2d r() const </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__obb_8cc_source.html#l00145">rectangle_obb.cc:145</a></div></div>
<div class="ttc" id="classcollision_1_1_rectangle_a_a_b_b_html_aa9a06f7b2d8e34b1560a5f90d95e6141"><div class="ttname"><a href="classcollision_1_1_rectangle_a_a_b_b.html#aa9a06f7b2d8e34b1560a5f90d95e6141">collision::RectangleAABB::r</a></div><div class="ttdeci">Eigen::Vector2d r() const </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__aabb_8cc_source.html#l00162">rectangle_aabb.cc:162</a></div></div>
<div class="ttc" id="timevariant__collisionobject_8h_html"><div class="ttname"><a href="timevariant__collisionobject_8h.html">timevariant_collisionobject.h</a></div></div>
<div class="ttc" id="triangle_8h_html"><div class="ttname"><a href="triangle_8h.html">triangle.h</a></div></div>
<div class="ttc" id="classcollision_1_1_sphere_html"><div class="ttname"><a href="classcollision_1_1_sphere.html">collision::Sphere</a></div><div class="ttdoc">Circle. </div><div class="ttdef"><b>Definition:</b> <a href="sphere_8h_source.html#l00014">sphere.h:14</a></div></div>
<div class="ttc" id="namespacecollision_1_1primitive__tests_html_a713e6933ef814707c8594d841ca1caae"><div class="ttname"><a href="namespacecollision_1_1primitive__tests.html#a713e6933ef814707c8594d841ca1caae">collision::primitive_tests::collisionDetection</a></div><div class="ttdeci">bool collisionDetection(const Point &amp;point_first, const Point &amp;point_second)</div><div class="ttdef"><b>Definition:</b> <a href="primitive__collision__tests_8h_source.html#l00037">primitive_collision_tests.h:37</a></div></div>
<div class="ttc" id="classcollision_1_1_shape_html_aab73c99dc12f8032c2e28585e7c152b5"><div class="ttname"><a href="classcollision_1_1_shape.html#aab73c99dc12f8032c2e28585e7c152b5">collision::Shape::center_y</a></div><div class="ttdeci">double center_y() const </div><div class="ttdef"><b>Definition:</b> <a href="shape_8cc_source.html#l00025">shape.cc:25</a></div></div>
<div class="ttc" id="namespacecollision_1_1primitive__tests_html_a5397d015356484f41c199a3d16374537"><div class="ttname"><a href="namespacecollision_1_1primitive__tests.html#a5397d015356484f41c199a3d16374537">collision::primitive_tests::pointInsideTriangle</a></div><div class="ttdeci">bool pointInsideTriangle(const Triangle &amp;triangle, const Eigen::Vector2d &amp;pt)</div><div class="ttdef"><b>Definition:</b> <a href="primitive__collision__tests_8h_source.html#l00328">primitive_collision_tests.h:328</a></div></div>
<div class="ttc" id="classcollision_1_1_rectangle_o_b_b_html_a44f98769d169cf2634529ac88d8352b5"><div class="ttname"><a href="classcollision_1_1_rectangle_o_b_b.html#a44f98769d169cf2634529ac88d8352b5">collision::RectangleOBB::local_x_axis</a></div><div class="ttdeci">Eigen::Vector2d local_x_axis() const </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__obb_8cc_source.html#l00137">rectangle_obb.cc:137</a></div></div>
<div class="ttc" id="classcollision_1_1_triangle_html_a54b9db16a2fb26c2c8f5ceadce4b6ddd"><div class="ttname"><a href="classcollision_1_1_triangle.html#a54b9db16a2fb26c2c8f5ceadce4b6ddd">collision::Triangle::v3</a></div><div class="ttdeci">Eigen::Vector2d v3() const </div><div class="ttdef"><b>Definition:</b> <a href="triangle_8cc_source.html#l00144">triangle.cc:144</a></div></div>
<div class="ttc" id="classcollision_1_1_rectangle_a_a_b_b_html"><div class="ttname"><a href="classcollision_1_1_rectangle_a_a_b_b.html">collision::RectangleAABB</a></div><div class="ttdoc">Axis-aligned rectangle. </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__aabb_8h_source.html#l00018">rectangle_aabb.h:18</a></div></div>
<div class="ttc" id="classcollision_1_1_rectangle_o_b_b_html_acfd69dbf1ef5814ca1ffcacd8a687886"><div class="ttname"><a href="classcollision_1_1_rectangle_o_b_b.html#acfd69dbf1ef5814ca1ffcacd8a687886">collision::RectangleOBB::squareDisToPoint</a></div><div class="ttdeci">double squareDisToPoint(const Eigen::Vector2d &amp;p) const </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__obb_8cc_source.html#l00202">rectangle_obb.cc:202</a></div></div>
<div class="ttc" id="rectangle__aabb_8h_html"><div class="ttname"><a href="rectangle__aabb_8h.html">rectangle_aabb.h</a></div></div>
<div class="ttc" id="classcollision_1_1_rectangle_o_b_b_html_aff8381b1b76c1e1fa8e4278de0cb3ec4"><div class="ttname"><a href="classcollision_1_1_rectangle_o_b_b.html#aff8381b1b76c1e1fa8e4278de0cb3ec4">collision::RectangleOBB::r_y</a></div><div class="ttdeci">double r_y() const </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__obb_8cc_source.html#l00164">rectangle_obb.cc:164</a></div></div>
<div class="ttc" id="classcollision_1_1_rectangle_a_a_b_b_html_a9cd0e5709ca571f12e7ba12a3372aaf1"><div class="ttname"><a href="classcollision_1_1_rectangle_a_a_b_b.html#a9cd0e5709ca571f12e7ba12a3372aaf1">collision::RectangleAABB::squareDisToPoint</a></div><div class="ttdeci">double squareDisToPoint(const Eigen::Vector2d &amp;p) const </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__aabb_8cc_source.html#l00240">rectangle_aabb.cc:240</a></div></div>
<div class="ttc" id="shape_8h_html"><div class="ttname"><a href="shape_8h.html">shape.h</a></div></div>
<div class="ttc" id="classcollision_1_1_sphere_html_a4aef03654ecf223907681c955ee36300"><div class="ttname"><a href="classcollision_1_1_sphere.html#a4aef03654ecf223907681c955ee36300">collision::Sphere::radius</a></div><div class="ttdeci">double radius() const </div><div class="ttdef"><b>Definition:</b> <a href="sphere_8h_source.html#l00072">sphere.h:72</a></div></div>
<div class="ttc" id="classcollision_1_1_rectangle_a_a_b_b_html_af8e8fb00b168518cd081b2c6b209ea62"><div class="ttname"><a href="classcollision_1_1_rectangle_a_a_b_b.html#af8e8fb00b168518cd081b2c6b209ea62">collision::RectangleAABB::r_x</a></div><div class="ttdeci">double r_x() const </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__aabb_8cc_source.html#l00184">rectangle_aabb.cc:184</a></div></div>
<div class="ttc" id="rectangle__obb_8h_html"><div class="ttname"><a href="rectangle__obb_8h.html">rectangle_obb.h</a></div></div>
<div class="ttc" id="classcollision_1_1_rectangle_o_b_b_html_ac8b2ebc023ff0dcc5ee861f8cdf79b60"><div class="ttname"><a href="classcollision_1_1_rectangle_o_b_b.html#ac8b2ebc023ff0dcc5ee861f8cdf79b60">collision::RectangleOBB::r_x</a></div><div class="ttdeci">double r_x() const </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__obb_8cc_source.html#l00160">rectangle_obb.cc:160</a></div></div>
<div class="ttc" id="classcollision_1_1_point_html"><div class="ttname"><a href="classcollision_1_1_point.html">collision::Point</a></div><div class="ttdoc">A point in space. </div><div class="ttdef"><b>Definition:</b> <a href="point_8h_source.html#l00015">point.h:15</a></div></div>
<div class="ttc" id="classcollision_1_1_rectangle_o_b_b_html_afd528c300c0e84268f3668ec30e325ee"><div class="ttname"><a href="classcollision_1_1_rectangle_o_b_b.html#afd528c300c0e84268f3668ec30e325ee">collision::RectangleOBB::local_axes</a></div><div class="ttdeci">Eigen::Matrix2d local_axes() const </div><div class="ttdef"><b>Definition:</b> <a href="rectangle__obb_8cc_source.html#l00133">rectangle_obb.cc:133</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.11
</small></address>
</body>
</html>
